﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.DirectoryServices;
using System.Linq;

namespace Library
{
  /// <summary>
  /// 共有フォルダーを表すクラスです。
  /// </summary>
  [DataObject()]
  public sealed class Volume : DomainObject
  {
    #region プライベートフィールド
    private string[] _keywords;
    #endregion

    #region インターナルコンストラクター
    /// <summary>
    /// <see cref="DirectoryEntry"/> を指定して <see cref="Volume"/> クラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="entry"><see cref="DirectoryEntry"/>。</param>
    internal Volume(DirectoryEntry entry)
      : base(entry)
    {
      _keywords = entry.Properties["keywords"].Cast<string>().ToArray();
    }
    #endregion

    #region パブリックプロパティ
    /// <summary>
    /// キーワードを取得または設定します。
    /// </summary>
    public string[] Keywords
    {
      get
      {
        return _keywords;
      }
      set
      {
        if (base.IsDisposed)
        {
          throw new ObjectDisposedException(this.GetType().Name);
        }
        base.Entry.Properties["keywords"].Value = value;
        _keywords = base.Entry.Properties["keywords"].Cast<string>().ToArray();
      }
    }

    /// <summary>
    /// UNC パスを取得または設定します。
    /// </summary>
    public string UncPath
    {
      get
      {
        if (base.IsDisposed)
        {
          throw new ObjectDisposedException(this.GetType().Name);
        }
        return (string)base.Entry.Properties["uNCName"].Value;
      }
      set
      {
        if (base.IsDisposed)
        {
          throw new ObjectDisposedException(this.GetType().Name);
        }
        base.Entry.Properties["uNCName"].Value = value;
      }
    }
    #endregion

    #region パブリックメソッド
    /// <summary>
    /// 指定した名前の共有フォルダーを検索します。このメソッドはデータバインド用です。
    /// </summary>
    /// <param name="name">名前。</param>
    /// <returns>共有フォルダー。</returns>
    [DataObjectMethod(DataObjectMethodType.Select)]
    public static Volume FindByName(string name)
    {
      return (Volume)DirectoryAccess.FindDirectoryObject(name, CategoryType.Volume);
    }

    /// <summary>
    /// 共有フォルダーの一覧を取得します。このメソッドはデータバインド用です。
    /// </summary>
    /// <returns>共有フォルダーの一覧。</returns>
    [DataObjectMethod(DataObjectMethodType.Select)]
    public static IList<Volume> GetVolumes()
    {
      return DirectoryAccess.GetVolumes();  //共有フォルダーを取得
    }
    #endregion
  }
}
